package com.crawler.system.service;

import com.crawler.system.dto.PageResult;
import com.crawler.system.entity.ProxyIp;

import java.util.List;
import java.util.Map;

/**
 * 代理IP服务接口
 */
public interface ProxyIpService {

    /**
     * 保存代理IP
     *
     * @param proxyIp 代理IP实体
     * @return 是否成功
     */
    boolean saveProxy(ProxyIp proxyIp);

    /**
     * 更新代理IP
     *
     * @param proxyIp 代理IP实体
     * @return 是否成功
     */
    boolean updateProxy(ProxyIp proxyIp);

    /**
     * 删除代理IP
     *
     * @param id 代理IP ID
     * @return 是否成功
     */
    boolean deleteProxy(Long id);

    /**
     * 批量删除代理IP
     *
     * @param ids 代理IP ID列表
     * @return 删除数量
     */
    int batchDeleteProxies(List<Long> ids);

    /**
     * 通过ID获取代理IP
     *
     * @param id 代理IP ID
     * @return 代理IP实体
     */
    ProxyIp getProxyById(Long id);

    /**
     * 分页获取代理IP列表
     *
     * @param params 查询参数
     * @return 分页结果
     */
    PageResult<ProxyIp> listProxies(Map<String, Object> params);

    /**
     * 验证代理IP是否有效
     *
     * @param id 代理IP ID
     * @return 是否有效
     */
    boolean validateProxy(Long id);

    /**
     * 批量验证代理IP是否有效
     *
     * @param ids 代理IP ID列表
     * @return 代理IP ID和有效性的映射
     */
    Map<Long, Boolean> validateProxies(List<Long> ids);

    /**
     * 批量导入代理IP
     *
     * @param proxyIps 代理IP列表
     * @return 导入数量
     */
    int batchImportProxies(List<ProxyIp> proxyIps);

    /**
     * 获取可用的代理IP列表
     *
     * @param params 查询参数
     * @return 代理IP列表
     */
    List<ProxyIp> getAvailableProxies(Map<String, Object> params);

    /**
     * 获取随机代理IP
     *
     * @param type 代理类型
     * @return 代理IP实体
     */
    ProxyIp getRandomProxy(String type);

    /**
     * 自动发现新的代理IP
     *
     * @return 发现的代理IP数量
     */
    int discoverProxies();

    /**
     * 根据ID获取有效的代理IP
     *
     * @param ids  代理IP ID列表
     * @param type 代理类型
     * @return 代理IP列表
     */
    List<ProxyIp> getProxiesByIds(List<Long> ids, String type);

    /**
     * 记录代理IP使用情况
     *
     * @param id          代理IP ID
     * @param success     是否成功
     * @param responseTime 响应时间(毫秒)
     */
    void recordProxyUsage(Long id, boolean success, long responseTime);

} 
